//RTP协议
//
//#define DVSDK_DM3730


#ifndef RTSP_SERVICE_RTP_UNIT_H
#define RTSP_SERVICE_RTP_UNIT_H

#include "rtsp_service.h"
#include "rtp_user.h"
#include "RLBufFile.h"
#include "PBufArry.h"
#include "PBufStr.h"
#include "TWList.h"
#include "typedef.h"

#define RTP_FILE_BUF_SIZE           1024
#define RTP_FRAME_BUF_SIZE          1500*100

#ifdef  DVSDK_DM3730
#define RTP_FRAME_HEADER_SIZE       14
#else
#define RTP_FRAME_HEADER_SIZE       13
#endif

#define RTP_PAYLOAD_MAX_SIZE        1400       //分片大小

#define RTPUNIT_RET_ERROR       -1
#define RTPUNIT_RET_SUCCEED     0


typedef struct RTP_Header {
    u8_t cc:        4;      //CSRC计数器,指示CSRC 标识符的个数
    u8_t x:         1;      //扩展标志,如果X=1，则在RTP报头后跟有一个扩展报头
    u8_t p:         1;      //填充标志,如果P=1，则在该报文的尾部填充一个或多个额外的八位组
    u8_t version:   2;      //版本号,当前协议版本号为2

    u8_t pt:        7;      //有效载荷类型,说明RTP报文中有效载荷的类型，如GSM音频、JPEM图像等
    u8_t m:         1;      //标记,对于视频，标记一帧的结束；对于音频，标记会话的开始

    u16_t seq;              //序列号,用于标识发送者所发送的RTP报文的序列号，每发送一个报文，序列号增1

    u32_t time;             //时戳,时戳反映了该RTP报文的第一个八位组的采样时刻

    u32_t ssrc;             //同步信源,用于标识同步信源。该标识符是随机选择的
} RTP_Header;

typedef struct NALU_Header {
    u8_t type:   5;         //这个NALU单元的类型
    u8_t nri:    2;         //似乎指示这个NALU的重要性
    u8_t f:      1;         //规范中规定了这一位必须为 0
} NALU_Header;

typedef struct Fu_Indicator {
    u8_t type:   5;
    u8_t nri:    2;
    u8_t f:      1;
} Fu_Indicator;

typedef struct Fu_Header {
    u8_t type:   5;
    u8_t r:      1;
    u8_t e:      1;
    u8_t s:      1;
} Fu_Header;


#ifdef DVSDK_DM3730

typedef struct RTPUnit {
    int socket_id;          //套接字@列表未完成
    u32_t seq_num;          //序列号
    u32_t ts_current;       //时间戳
    unsigned char buf[RTP_PAYLOAD_MAX_SIZE + RTP_FRAME_HEADER_SIZE]; //发送缓冲区
} RTPUnit;

#else
#define RTPUNIT_URL_SIZE 2048
typedef struct RTPUnit {
    struct RTSPService *service;
    unsigned int reference;                                             //引用计数
    unsigned int play_number;                                           //播放客户
    unsigned char type;                                                 //类型:共享，单播
    PBufStr url;
    char url_buf[RTPUNIT_URL_SIZE];                                     //资源路径
    unsigned int url_hashkey;                                           //资源哈希值

    u32_t seq_num;                                                      //序列号
    u32_t ts_current;                                                    //时间戳
    unsigned char filebuf[RTP_FILE_BUF_SIZE];                           //文件读取缓冲区
    RLBufFile bfile;                                                     //文件操作
    unsigned char framebuf[RTP_FRAME_BUF_SIZE + RTP_FRAME_HEADER_SIZE];  //帧缓冲区
    PBufArray pbbuf;                                                     //缓冲区操作
    TWListHead cliten_list;                                             //客户端列表
} RTPUnit;
#endif

extern void RTPUnit_init(RTPUnit *unit,struct RTSPService *service, FILE *file);

extern int RTPUnit_client_add(RTPUnit *unit, TWListNode *node);

extern int RTPUnit_client_delete(RTPUnit *unit, TWListNode *node);

extern int RTPUnit_clinent_send(RTPUnit *unit, unsigned char *buf, unsigned int buflen);

extern int RTPUnit_frame_read(RTPUnit *unit);

extern s32_t RTPUnit_pack_send(RTPUnit *unit);

extern void *RTPUnit_send_task(RTPUnit *unit);

#endif //RTSP_SERVICE_RTP_UNIT_H
